#TODO: VER COMO CAMBIAR EL CONTROL DE LIBERADO POR CAJA, YA QUE "usuario.num_cuenta.to_i==0"
#no es retro activo. SUG.: Agregar un campo a recibo que determine si el recibo fue liberado por caja o no.
class SueldosController < ApplicationController
  #MODULE: Gestión Salarial
  Formatos=[["Planilla",0],["Interbanco",1],["Resumen",2]]

  def index 
  end

  def planilla #DESC: Generación de la planilla de salarios y aguinaldos.
    @title="Sueldos"
    return unless request.method == :post
    condiciones = set_def_conds
    @recibos = find_all_of("Recibo",condiciones.merge(:mes=>params[:date][:month],:anho=>params[:date][:year],:aguinaldo=>params[:planilla][:tipo]))
    @movimientos = @recibos
    #Formato Interbanco
    if params[:planilla][:formato].to_i == 1
      formato_interbanco
    elsif params[:planilla][:formato].to_i == 2
      condiciones[:fecha] = get_periodo
      #@movimientos = find_all_of("Movimiento",condiciones)
      #fill_datos
      @datos={}
      @recibos.each do |recibo|
        if recibo.valor_neto && recibo.usuario.num_cuenta
          @datos[recibo.usuario.sucursal.nombre] ||= 0
          @datos[recibo.usuario.sucursal.nombre] += recibo.valor_neto
        end
      end
      render :action => "resumen"
    end
  end

  def quincena #DESC: Deneración de la planilla de Quincenas.
    @title="Quincenas"
    return unless request.method == :post
   # condiciones = set_def_conds
    condiciones = {}
    condiciones[:fecha] = get_periodo
    condiciones[:tipo_movimiento_id] = APP_CONFIG[:quincenas]
    #logger.info "\n\n\nquincenas: #{condiciones[:tipo_movimiento_id]}"
    @movimientos = find_all_of("Movimiento",condiciones)
    #Formato Interbanco
    if params[:planilla][:formato].to_i == 1
      #formato_interbanco
      it=ItauTransfer.new(params[:planilla][:usuario],@movimientos,{
          :tipo_registro=>:detalle,
          :fecha_credito_primera=>Date.strptime(params[:planilla][:fecha_credito], "%d/%m/%Y"),
          :fecha_carga=>Date.strptime(params[:planilla][:fecha_carga], "%d/%m/%Y"),
          :tipo_transferencia=>:pago_proveedores,
          :codigo_empresa=>params[:planilla][:codigo_empresa].to_i,
          :cuenta_debito_empresa=>params[:planilla][:cuenta].to_i,
          :cuenta_debito_empresa_id=>nil,
          :tipo=>:credito,
          :tipo_factura=>:contado,
          :moneda=>:guaranies,
          :hora_carga =>{:hour=>params[:planilla][:hora],:minute=> params[:planilla][:minuto]}
        })
      @movimientos_con_error=it.movimientos_con_error

      regs=it.generar_registros
      @content,file_name = [regs,"TRANSFER.txt"]
      transfer_dir=Rails.public_path+'/'
      f=File.new(transfer_dir+file_name,'w+')
      #puts @content
      #@content=@content.encode!('ASCII', 'UTF-8', :invalid => :replace,:undef =>:replace, :replace => '?')
      r=f.write(@content)
      f.close
      system('unix2dos ',f.path+file_name)
      send_file f.path
    elsif params[:planilla][:formato].to_i == 2
      fill_datos
      render :action => "resumen"
    end
  end

  def predefinidos #DESC: Genaración de los movimientos predefinidos.
    if request.method == :post
      ano = params[:date][:year]
      mes = params[:date][:month]
      if Movimiento.check_predefinidos(ano, mes) && !params[:borrar]
        flash[:notice] = "Ya existe movimientos predefinidos para el mes actual"
      else
        flash[:notice] = "Generado correctamente"
        Usuario.activos.each do |user|
          user.borrar_predefinidos(ano, mes)
          user.generar_predefinidos(ano, mes)
        end
      end
    end
  end

  def resumen_movimientos #DESC: Visualizar el resumen de movimientos.
    respond_to do |wants|
      wants.html {}
      wants.js do
        condiciones=get_condiciones_resumen_mov(params)
        @periodo="#{params[:date][:month]}/#{params[:date][:year]}"
        @tipo_texto=condiciones[:aguinaldo] == 1 ? "aguinaldos" : "sueldos"
        @sucursal_id=params[:sucursal_id]
        @month=params[:date][:month]
        @year=params[:date][:year]
        @tipo=params[:tipo]
        @datos = Recibo.generar_resumen_movimientos(params[:sucursal_id],condiciones)
        @unit='Gs. '
        render :update do |page|
          page.replace_html "resumen_movimientos_datos",:partial => "resumen_movimientos_datos"
          page<<"$.unblockUI();"
        end
      end
      wants.csv do
        condiciones=get_condiciones_resumen_mov(params)
        send_data Recibo.generar_resumen_movimientos(params[:sucursal_id],condiciones,true),
          :type => 'text/csv; charset=iso-8859-1; header=present',
          :disposition => "attachment; filename=resumen_movimientos_#{UtilHelper.mes_nombre(params[:date][:month])}_de_#{params[:date][:year]}.csv",
          :encoding => 'U'
      end
      wants.xls do
        condiciones=get_condiciones_resumen_mov(params)
        @periodo="#{params[:date][:month]}/#{params[:date][:year]}"
        @tipo_texto=condiciones[:aguinaldo] == 1 ? "aguinaldos" : "sueldos"
        @sucursal_id=params[:sucursal_id]
        @month=params[:date][:month]
        @year=params[:date][:year]
        @tipo=params[:tipo]
        @datos = Recibo.generar_resumen_movimientos(params[:sucursal_id],condiciones)
        @unit=''
        headers['Content-Type'] = "application/vnd.ms-excel"
        headers['Content-Disposition'] = "attachment; filename=resumen_de_movimientos_#{UtilHelper.mes_nombre(params[:date][:month])}_de_#{params[:date][:year]}.xls"
        headers['Cache-Control'] = ''
        render :partial =>"resumen_movimientos_datos.html"
      end
    end
  end 

  def resumen_movimientos_tipos #DESC: Visualizar el resumen de tipos movimientos por periodo.
    if request.method == :post
      condiciones = {}
      condiciones["usuarios.sucursal_id"] = params[:planilla][:sucursal_id] if params[:planilla][:sucursal_id] && !params[:planilla][:sucursal_id].empty?
      fecha = Time.mktime(params[:date][:year], params[:date][:month])
      condiciones[:fecha] = fecha.at_beginning_of_month..fecha.at_end_of_month
      @movimientos = Movimiento.sum(:valor, :group => [:tipo_movimiento], :conditions => condiciones, :joins => :usuario )
    end
  end #res_mov

  private
  def get_condiciones_resumen_mov(params)
    condiciones = {}
    condiciones["usuarios.sucursal_id"] = params[:sucursal_id] if (!params[:sucursal_id].blank? and !params[:sucursal_id].to_i.zero?)
    condiciones[:mes] = params[:date][:month]
    condiciones[:anho] = params[:date][:year]
    condiciones[:aguinaldo] = params[:tipo].to_i
    condiciones
  end
  #Para quincena y planilla
  def get_periodo
    fecha = Time.mktime(params[:date][:year], params[:date][:month])
    fecha.at_beginning_of_month..fecha.at_end_of_month
  end
  def find_all_of(modelo,condiciones)
    modelo.titleize.singularize.constantize.find(:all,
      :conditions => condiciones,
      :joins => {:usuario => :sucursal}, :order => "usuarios.nombres, usuarios.apellidos")
  end
  def set_def_conds
    condiciones={}
    condiciones["usuarios.activo"] = 1
    condiciones["usuarios.sucursal_id"] = params[:planilla][:sucursal_id] unless params[:planilla][:sucursal_id].blank?
    condiciones["sucursales.empresa_id"] = params[:planilla][:empresa_id] unless params[:planilla][:empresa_id].blank?
    condiciones
  end
  def fill_datos
    @datos = {}
    @movimientos.each do |mov|
      if mov.valor && mov.usuario.num_cuenta && mov.tipo_movimiento_id.to_i>0
        @datos[mov.usuario.sucursal.nombre] ||= 0
        @datos[mov.usuario.sucursal.nombre] += mov.valor
      end
    end
  end
  def formato_interbanco
    @opts = {}
    if params[:planilla][:fecha_carga] and params[:planilla][:fecha_credito] and params[:planilla][:hora] and params[:planilla][:minuto]
      @opts[:emp_codigo] = params[:planilla][:codigo_empresa]
      @opts[:num_cuenta] = params[:planilla][:cuenta]
      @opts[:usuario] = params[:planilla][:usuario]
      @opts[:fecha_carga] = Date.strptime(params[:planilla][:fecha_carga], "%d/%m/%Y")
      @opts[:fecha_credito] = Date.strptime(params[:planilla][:fecha_credito], "%d/%m/%Y")
      @opts[:hora] = Time.mktime(2009,10,1,params[:planilla][:hora], params[:planilla][:minuto])
      #response.headers['Content-Type'] = 'text/plain'
      #response.headers['Content-Disposition'] = 'attachment; filename=TRANSFER.txt'
      render :action => "interbanco", :layout => false
    end
  end
end
